#ifndef _HAL_UTIL_H
#define _HAL_UTIL_H

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "../core/config.h"
#include "../common.h"

#define msleep(n) usleep(n * 1000)

uint16_t util_crc16(uint8_t *buffer, uint16_t buffer_length);

cfg_ch_t *util_cfg_ch_add(cfg_ch_t *header, cfg_ch_t *new_node);
cfg_su_t *util_cfg_su_add(cfg_su_t *header, cfg_su_t *new_node);
cfg_pu_t* util_cfg_pu_add(cfg_pu_t* header,cfg_pu_t* new_node);

cfg_node_t* util_cfg_node_add(cfg_node_t* header,cfg_node_t* new_node);
cfg_temp_t* util_cfg_temp_add(cfg_temp_t* header,cfg_temp_t* new_node);

int util_get_ch_cnts(cfg_su_t *su, int group_id);
int util_ch_init(cfg_temp_t *temp, cfg_ch_t *ch_header, int group_id);

// 文件读取
char *util_file_read(char *path);
// 字符串流转换成uint8_t流
int util_format_hex(char* hexstr,uint8_t* hex);
// 16进制打印
void util_hex_print(uint8_t* buf,uint16_t len);
// 字符串分隔
int util_split(char* str,char c,char**buf,int max_num);
#define UTIL_SPLIT(src,split,buf) util_split(src,split,buf,sizeof(buf) / sizeof(char *))

// .ini 
int util_cfg_ini_set(char *title,char *key,char* val,char *path);
char *util_get_ini_key_string(char *title, char *key, char *filename);
int util_get_ini_key_int(char *title,char *key,char *filename);


// --------------------- 硬件公共接口 --------------------- //
// 根据串口号获取设备号
int util_hw_get_serial_dev(char* model,char* com,char* dev);
// 获取系统时间
void util_hw_get_systime(char * systime);
// 获取系统时间戳
int util_hw_get_systs(void);
// 设置系统时间
int util_hw_set_systime(int ts);
// ts换成日历时间
void util_hw_ts2tm(char * systime,const time_t * ts);
// 年月日时分秒转换成ts
int util_hw_tm2ts(int year,int month,int day,int hour,int min,int sec);
// 获取CPU占用率
float util_hw_get_cpu_usage(void);

// --------------------- ch公共接口 --------------------- //
// // 获取ch的内存长度
// int util_ch_get_type_len(ch_type_t type);
// // ch类型信息转换为ch_type_t结构
// ch_type_t util_ch_format_type(char *type);
// // ch属性信息转换为ch_attri_t结构
// ch_attri_t util_ch_format_attri(char *attri);
// // 获取字符串数据
// int util_ch_get_string_val(cfg_ch_t* ch,char* dst);

// // 获取浮点数据
// int util_ch_get_double_val(cfg_ch_t* ch,double* val);
// // 设置浮点数据
// int util_ch_set_double_val(cfg_ch_t* ch,double* val);
// // 获取整数
// int util_ch_get_integer_val(cfg_ch_t* ch,int64_t* val);
// // 设置整数
// int util_ch_set_integer_val(cfg_ch_t* ch,int64_t* val);

// --------------------- 日志公共接口 --------------------- //
#define UTIL_LOG_D(pu,format, ...) \
    do { \
        api_t* api = (api_t*)pu->hanlder.api; \
        api->log_p(pu->name,0,format, ##__VA_ARGS__); \
    }while(0)
    
#define UTIL_LOG_I(pu,format, ...) \
    do { \
        api_t* api = (api_t*)pu->hanlder.api; \
        api->log_p(pu->name,1,format, ##__VA_ARGS__); \
    }while(0)
    
#define UTIL_LOG_W(pu,format, ...) \
    do { \
        api_t* api = (api_t*)pu->hanlder.api; \
        api->log_p(pu->name,2,format, ##__VA_ARGS__); \
    }while(0)

#define UTIL_LOG_E(pu,format, ...) \
    do { \
        char fmt[1000*2] = ""; \
        strcat(fmt,"%s %d -->"); \
        strcat(fmt,format); \
        api_t* api = (api_t*)pu->hanlder.api; \
        api->log_p(pu->name,3,fmt, __FILE__,__LINE__, ##__VA_ARGS__); \
    }while(0)

#endif
